home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / hard / drivr / BetaScan_1.12.lha / BetaScan / ScannerDev / scanner.c < prev    next >
C/C++ Source or Header  |  1998-10-04  |  7KB  |  280 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. #include <exec/types.h>
  6. #include <proto/icon.h>
  7.  
  8. #include "MakeILBM.h"
  9. #include "Scanner.h"
  10. #include "Scanner_protos.h"
  11.  
  12. static int    depth;
  13. static ULONG  color;
  14. static double fx0,fy0,fx1,fy1;
  15. static int    resolution;
  16. static int    brightness;
  17. static int    contrast;
  18. static int    shadow;
  19. static int    highlight;
  20. static int    midtone;
  21. static int    halftonePattern;
  22. static int    exposureTime;   
  23. static double gamma;
  24. static int    compress;
  25. static char*  outputFile;
  26.  
  27. short readToolTypes(char **array,struct ScannerOptions* option);
  28.  
  29. /**************************************************************************/
  30.  
  31. /**********************           M A I N           ***********************/
  32.  
  33. /**************************************************************************/
  34. int main(int argc, char **argv)
  35. {
  36.   struct ScannerOptions option;
  37.   BYTE   status;
  38.  
  39.   memset(&option,0,sizeof(struct ScannerOptions));
  40.   openScanner("scsi.device",2,&option,&status);
  41.  
  42.   if( status == 0)
  43.   {
  44.     struct ScanParameters  param;
  45.     struct ScanInformation inform;
  46.    
  47.     if( status = readToolTypes(&argv[1],&option) )
  48.     {
  49.       closeScanner();
  50.       exit(status);
  51.     }
  52.  
  53.     param.sp_ColorNum = color;
  54.     param.sp_x0 = fx0;
  55.     param.sp_y0 = fy0;
  56.     param.sp_x1 = fx1;
  57.     param.sp_y1 = fy1;
  58.     param.sp_xResolution = resolution;
  59.     param.sp_yResolution = resolution;
  60.     param.sp_brightness[0] = brightness;
  61.     param.sp_brightness[1] = brightness;
  62.     param.sp_brightness[2] = brightness;
  63.     param.sp_contrast = contrast;
  64.     param.sp_shadow = shadow;
  65.     param.sp_highlight = highlight;
  66.     param.sp_midtone = midtone; 
  67.     param.sp_halftonePattern = halftonePattern; 
  68.     param.sp_exposureTime = exposureTime;
  69.     param.sp_gamma = gamma;
  70.     param.sp_flags = 0;
  71.    
  72.     setParameter(¶m,&status);
  73.    
  74.     if( status == 0 )
  75.     {
  76.       startScanning(&inform,&status);
  77.      
  78.       if( status == 0 )
  79.       {
  80.         struct ILBMFile *fh;
  81.         UBYTE* line = NULL;
  82.         
  83.         if( (line = malloc(inform.sv_bytesPerLine+1)) && (fh = openILBM(outputFile,inform.sv_imageWidth,inform.sv_imageHeight,depth,inform.sv_xResolution,inform.sv_yResolution,compress)) )
  84.         {
  85.           ULONG length;
  86.           
  87.           while( status == 0 )
  88.           {
  89.             length = inform.sv_bytesPerLine+1;
  90.             readScanLine(line,&length,&status);
  91.             if( status == 0 )
  92.               writeILBM(fh,line+1,*line);
  93.           }
  94.           
  95.           if( status == SCAN_STATUS_EOF )
  96.           {
  97.             closeILBM(fh,0);
  98.             status = 0;
  99.           }
  100.           else
  101.             closeILBM(fh,1);
  102.         }
  103.  
  104.         stopScanning();
  105.         
  106.         if( line )
  107.           free(line);
  108.       }
  109.     }
  110.  
  111.    closeScanner();
  112.  }
  113.  return status;
  114. }
  115.  
  116. short readToolTypes(char **array,struct ScannerOptions* option)
  117. {
  118.   char* str;
  119.   
  120.   // Get scan color
  121.   if( str = FindToolType(array,"color") )
  122.   {
  123.     if( MatchToolValue(str,"halftone") )
  124.     {
  125.       color = COLORNUM_HALFTONE;
  126.       depth = 1;
  127.     }
  128.     else if( MatchToolValue(str,"bw") )
  129.     {
  130.       color = COLORNUM_BW;
  131.       depth = 1;
  132.     }
  133.     else if( MatchToolValue(str,"gray") )
  134.     {
  135.       color = COLORNUM_GREY8;
  136.       depth = 8;
  137.     }
  138.     else if( MatchToolValue(str,"rgb24") )
  139.     {
  140.       color = COLORNUM_RGB24;
  141.       depth = 24;
  142.     }
  143.     else
  144.       return 1;
  145.       
  146.     if( !(option->so_colorMode & color) )
  147.       return 1;
  148.   }
  149.   else
  150.   {
  151.     color = COLORNUM_RGB24;
  152.     depth = 24;
  153.   }
  154.     
  155.   // Get frame coordinates
  156.   if( str = FindToolType(array,"frame") )
  157.   {
  158.     fx0 = strtod(str,&str);
  159.     if( *(str++) != ',' )
  160.       return 2;
  161.     fy0 = strtod(str,&str);
  162.     if( *(str++) != ',' )
  163.       return 2;
  164.     fx1 = strtod(str,&str);
  165.     if( *(str++) != ',' )
  166.       return 2;
  167.     fy1 = strtod(str,&str);
  168.     if( (*str != ' ') && (*str != 0) )
  169.       return 2;
  170.   }
  171.   else
  172.   {
  173.     fx0 = 25.0;
  174.     fy0 = 50.0;
  175.     fx1 = 75.0;
  176.     fy1 = 100.0;
  177.   }
  178.  
  179.   // Get resolution
  180.   if( str = FindToolType(array,"resolution") )
  181.   {
  182.     resolution = strtol(str,NULL,10);
  183.     if( (resolution <= 0) || (resolution > option->so_interResolution) )
  184.       return 3;
  185.   }
  186.   else
  187.     resolution = option->so_opticResolution;
  188.  
  189.   if( option->so_brightnessStep && (str = FindToolType(array,"brightness")) )
  190.   {
  191.     brightness = ((strtol(str,NULL,10)-option->so_brightnessMin)/option->so_brightnessStep)*option->so_brightnessStep+option->so_brightnessMin;
  192.     if( (brightness < option->so_brightnessMin) || (brightness > option->so_brightnessMax) )
  193.       return 4;
  194.   }
  195.   else
  196.     brightness = option->so_brightnessDefault;
  197.  
  198.   if( option->so_contrastStep && (str = FindToolType(array,"contrast")) )
  199.   {
  200.     contrast = ((strtol(str,NULL,10)-option->so_contrastMin)/option->so_contrastStep)*option->so_contrastStep+option->so_contrastMin;
  201.     if( (contrast < option->so_contrastMin) || (contrast > option->so_contrastMax) )
  202.       return 5;
  203.   }
  204.   else
  205.     contrast = option->so_contrastDefault;
  206.  
  207.   if( option->so_shadowStep && (str = FindToolType(array,"shadow")) )
  208.   {
  209.     shadow = ((strtol(str,NULL,10)-option->so_shadowMin)/option->so_shadowStep)*option->so_shadowStep+option->so_shadowMin;
  210.     if( (shadow < option->so_shadowMin) || (shadow > option->so_shadowMax) )
  211.       return 5;
  212.   }
  213.   else
  214.     shadow = option->so_shadowDefault;
  215.  
  216.   if( option->so_highlightStep && (str = FindToolType(array,"highlight")) )
  217.   {
  218.     highlight = ((strtol(str,NULL,10)-option->so_highlightMin)/option->so_highlightStep)*option->so_highlightStep+option->so_highlightMin;
  219.     if( (highlight < option->so_highlightMin) || (highlight > option->so_highlightMax) )
  220.       return 6;
  221.   }
  222.   else
  223.     highlight = option->so_highlightDefault;
  224.  
  225.   if( option->so_midtoneStep && (str = FindToolType(array,"midtone")) )
  226.   {
  227.     midtone = ((strtol(str,NULL,10)-option->so_midtoneMin)/option->so_midtoneStep)*option->so_midtoneStep+option->so_midtoneMin;
  228.     if( (midtone < option->so_midtoneMin) || (midtone > option->so_midtoneMax) )
  229.       return 7;
  230.   }
  231.   else
  232.     midtone = option->so_midtoneDefault;
  233.  
  234.   if( option->so_halftonePatternStep && (str = FindToolType(array,"pattern")) )
  235.   {
  236.     halftonePattern = ((strtol(str,NULL,10)-option->so_halftonePatternMin)/option->so_halftonePatternStep)*option->so_halftonePatternStep+option->so_halftonePatternMin;
  237.     if( (halftonePattern < option->so_halftonePatternMin) || (halftonePattern > option->so_halftonePatternMax) )
  238.       return 8;
  239.   }
  240.   else
  241.     halftonePattern = option->so_halftonePatternDefault;
  242.  
  243.   if( option->so_exposureTimeStep && (str = FindToolType(array,"time")) )
  244.   {
  245.     exposureTime = ((strtol(str,NULL,10)-option->so_exposureTimeMin)/option->so_exposureTimeStep)*option->so_exposureTimeStep+option->so_exposureTimeMin;
  246.     if( (exposureTime < option->so_exposureTimeMin) || (exposureTime > option->so_exposureTimeMax) )
  247.       return 9;
  248.   }
  249.   else
  250.     exposureTime = option->so_exposureTimeDefault;
  251.  
  252.   if( option->so_maxLookupTableSize && (str = FindToolType(array,"gamma")) )
  253.   {
  254.     gamma = strtod(str,&str);
  255.     if( (*str != ' ') && (*str != 0) )
  256.       return 10;
  257.     if( gamma <= 0.0 )
  258.       return 10;
  259.   }
  260.   else
  261.     gamma = 1.0;
  262.  
  263.   if( str = FindToolType(array,"compress") )
  264.   {
  265.     if( MatchToolValue(str,"on") )
  266.       compress = 1;
  267.     else if( MatchToolValue(str,"off") )
  268.       compress = 0;
  269.     else
  270.       return 11;
  271.   }
  272.   else
  273.     compress = 1;
  274.  
  275.   if( !(outputFile = FindToolType(array,"file")) )
  276.     outputFile = "ram:scanner.ilbm";
  277.     
  278.   return 0;
  279. }
  280.